home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / arch / arm / include / asm / processor.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  2.9 KB  |  132 lines

  1. /*
  2.  *  arch/arm/include/asm/processor.h
  3.  *
  4.  *  Copyright (C) 1995-1999 Russell King
  5.  *
  6.  * This program is free software; you can redistribute it and/or modify
  7.  * it under the terms of the GNU General Public License version 2 as
  8.  * published by the Free Software Foundation.
  9.  */
  10.  
  11. #ifndef __ASM_ARM_PROCESSOR_H
  12. #define __ASM_ARM_PROCESSOR_H
  13.  
  14. /*
  15.  * Default implementation of macro that returns current
  16.  * instruction pointer ("program counter").
  17.  */
  18. #define current_text_addr() ({ __label__ _l; _l: &&_l;})
  19.  
  20. #ifdef __KERNEL__
  21.  
  22. #include <asm/ptrace.h>
  23. #include <asm/types.h>
  24.  
  25. #ifdef __KERNEL__
  26. #define STACK_TOP    ((current->personality & ADDR_LIMIT_32BIT) ? \
  27.              TASK_SIZE : TASK_SIZE_26)
  28. #define STACK_TOP_MAX    TASK_SIZE
  29. #endif
  30.  
  31. union debug_insn {
  32.     u32    arm;
  33.     u16    thumb;
  34. };
  35.  
  36. struct debug_entry {
  37.     u32            address;
  38.     union debug_insn    insn;
  39. };
  40.  
  41. struct debug_info {
  42.     int            nsaved;
  43.     struct debug_entry    bp[2];
  44. };
  45.  
  46. struct thread_struct {
  47.                             /* fault info      */
  48.     unsigned long        address;
  49.     unsigned long        trap_no;
  50.     unsigned long        error_code;
  51.                             /* debugging      */
  52.     struct debug_info    debug;
  53. };
  54.  
  55. #define INIT_THREAD  {    }
  56.  
  57. #ifdef CONFIG_MMU
  58. #define nommu_start_thread(regs) do { } while (0)
  59. #else
  60. #define nommu_start_thread(regs) regs->ARM_r10 = current->mm->start_data
  61. #endif
  62.  
  63. #define start_thread(regs,pc,sp)                    \
  64. ({                                    \
  65.     unsigned long *stack = (unsigned long *)sp;            \
  66.     set_fs(USER_DS);                        \
  67.     memzero(regs->uregs, sizeof(regs->uregs));            \
  68.     if (current->personality & ADDR_LIMIT_32BIT)            \
  69.         regs->ARM_cpsr = USR_MODE;                \
  70.     else                                \
  71.         regs->ARM_cpsr = USR26_MODE;                \
  72.     if (elf_hwcap & HWCAP_THUMB && pc & 1)                \
  73.         regs->ARM_cpsr |= PSR_T_BIT;                \
  74.     regs->ARM_pc = pc & ~1;        /* pc */            \
  75.     regs->ARM_sp = sp;        /* sp */            \
  76.     regs->ARM_r2 = stack[2];    /* r2 (envp) */            \
  77.     regs->ARM_r1 = stack[1];    /* r1 (argv) */            \
  78.     regs->ARM_r0 = stack[0];    /* r0 (argc) */            \
  79.     nommu_start_thread(regs);                    \
  80. })
  81.  
  82. /* Forward declaration, a strange C thing */
  83. struct task_struct;
  84.  
  85. /* Free all resources held by a thread. */
  86. extern void release_thread(struct task_struct *);
  87.  
  88. /* Prepare to copy thread state - unlazy all lazy status */
  89. #define prepare_to_copy(tsk)    do { } while (0)
  90.  
  91. unsigned long get_wchan(struct task_struct *p);
  92.  
  93. #define cpu_relax()            barrier()
  94.  
  95. /*
  96.  * Create a new kernel thread
  97.  */
  98. extern int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);
  99.  
  100. #define task_pt_regs(p) \
  101.     ((struct pt_regs *)(THREAD_START_SP + task_stack_page(p)) - 1)
  102.  
  103. #define KSTK_EIP(tsk)    task_pt_regs(tsk)->ARM_pc
  104. #define KSTK_ESP(tsk)    task_pt_regs(tsk)->ARM_sp
  105.  
  106. /*
  107.  * Prefetching support - only ARMv5.
  108.  */
  109. #if __LINUX_ARM_ARCH__ >= 5
  110.  
  111. #define ARCH_HAS_PREFETCH
  112. static inline void prefetch(const void *ptr)
  113. {
  114.     __asm__ __volatile__(
  115.         "pld\t%a0"
  116.         :
  117.         : "p" (ptr)
  118.         : "cc");
  119. }
  120.  
  121. #define ARCH_HAS_PREFETCHW
  122. #define prefetchw(ptr)    prefetch(ptr)
  123.  
  124. #define ARCH_HAS_SPINLOCK_PREFETCH
  125. #define spin_lock_prefetch(x) do { } while (0)
  126.  
  127. #endif
  128.  
  129. #endif
  130.  
  131. #endif /* __ASM_ARM_PROCESSOR_H */
  132.